import re

def response_wrong_floor(s, min_floor=1, max_floor=3):
    """
    判断是否为错误楼层意图
    
    参数:
    s: 输入的字符串
    min_floor: 最小楼层，默认为1
    max_floor: 最大楼层，默认为3
    
    返回:
    bool: 如果包含前中后关键字且楼层不在范围内，返回True；否则返回False
    """
    # 定义关键字
    front_keywords = ["到", "去", "上", "下"]
    back_keywords = ["层", "楼","室"]
    
    # 检查是否同时包含前关键字和后关键字
    has_front = any(keyword in s for keyword in front_keywords)
    has_back = any(keyword in s for keyword in back_keywords)
    
    if not (has_front and has_back):
        return False
    
    # 中文数字到阿拉伯数字的映射
    chinese_to_num = {
        '一': 1, '二': 2, '三': 3, '四': 4, '五': 5,
        '六': 6, '七': 7, '八': 8, '九': 9, '十': 10,
        '零': 0, '负': -1
    }
    
    # 合并正则表达式，匹配楼层数字或特殊模式
    middle_patterns = [
        r'[负\-]?\d+\.\d+',  # 小数（如 -1.5, 0.5, 3.5）
        r'[负\-]?\d+',      # 整数（包括负数，如 -1, 4）
        r'B\d+',            # 地下楼层（如 B1, B2）
        r'地下\d*',         # 地下楼层（如 地下, 地下1）
    ]
    
    pattern = '|'.join(middle_patterns)
    matches = re.findall(pattern, s)
    
    if not matches:  # 没有找到中关键字
        # 检查中文数字（如“二”）
        for char in chinese_to_num:
            if char in s:
                num = chinese_to_num[char]
                if num < min_floor or num > max_floor:
                    return True
        return False
    
    for match in matches:
        try:
            # 处理 B1, B2 等地下楼层
            if match.startswith('B'):
                floor = -int(match[1:])  # B1 -> -1, B2 -> -2
                return floor < min_floor or floor > max_floor
            
            # 处理“地下”或“地下X”
            if match.startswith('地下'):
                floor = -1  # 默认地下为 -1
                if len(match) > 2:  # 处理“地下1”之类
                    floor = -int(match[2:])
                return floor < min_floor or floor > max_floor
            
            # 处理负号
            if match.startswith('负'):
                match = '-' + match[1:]
            
            # 转换为浮点数
            floor = float(match)
            
            # 处理浮点数与整数的等价性（如 1.0 == 1）
            if floor.is_integer():
                floor = int(floor)
            
            # 判断是否在有效范围内
            if floor < min_floor or floor > max_floor:
                return True
                
        except ValueError:
            continue
    
    return False


# 测试示例
if __name__ == "__main__":
    test_cases = [
        ("到4层", True),       # 超出范围
        ("到3.5层", True),     # 超出范围
        ("到.5层", True),      # 0.5 不在范围内
        ("去5楼", True),       # 超出范围
        ("上2层", False),      # 在范围内
        ("下到1楼", False),    # 在范围内
        ("到负1楼", True),     # 负楼层
        ("上10楼", True),      # 超出范围
        ("到地下室", True),    # 地下为负楼层
        ("去地下1楼", True),   # 地下1为 -1
        ("到1.0楼", False),    # 1.0 等价于 1，在范围内
        ("到0.9层", True),     # 0.9 不在范围内
        ("请开门", False),     # 无关键字
        ("到二楼", False),     # 2 在范围内
        ("去B1层", True),      # B1 表示 -1，不在范围内
    ]
    
    for test, expected in test_cases:
        result = response_wrong_floor(test)
        print(f"'{test}' -> {result} (Expected: {expected})")